﻿using vudu.EnlaceDatos.SqlServer;
using System;
using vudu.Logica.Clases;
using System.Collections.Generic;
using NUnit.Framework;

namespace vudu.Pruebas
{

    [TestFixture]
    public class PruebaEnlaceDeDatosHorarioPreMatricula
    {

        #region Pruebas para SqlServerHorarioPreMatricula

        // AgregarPreMatricula E InsertarPreMatricual
        //[Test]
        //public void AgregarPreMatriculaTest()
        //{
        //    SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula(); // TODO: Initialize to an appropriate value
        //    int miEstudiante = 3; // TODO: Initialize to an appropriate value
        //    HorarioPreMatricula miHorario = new HorarioPreMatricula();// TODO: Initialize to an appropriate value

        //    miHorario.Fecha = System.DateTime.Now;
        //    miHorario.Nombre = "Buenas Tardes";
        //    miHorario.Estatus = "Pendiente";

        //    SeccionMateria materia2 = new SeccionMateria();
        //    materia2.IdSeccionMateria = 2;

        //    Practica practica = new Practica();
        //    practica.IdPractica = 2;

        //    List<SeccionMateria> nuevaLista = new List<SeccionMateria>();

        //    nuevaLista.Add(materia2);
        //    miHorario.ListaSecciones = nuevaLista;

        //    bool expected = true; // TODO: Initialize to an appropriate value
        //    bool actual;
        //    actual = target.AgregarPreMatricula(miEstudiante, miHorario);
        //    Assert.AreEqual(expected, actual);
        //}


        // Test InsertarHorarioPrematricula
        //[Test] 
        //public void InsertarHorarioPreMatriculaTest()
        //{
        //    SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula(); // TODO: Initialize to an appropriate value
        //    int miEstudiante = 1; // TODO: Initialize to an appropriate value
        //    HorarioPreMatricula miHorario = new HorarioPreMatricula(); // TODO: Initialize to an appropriate value
        //    miHorario.Estatus = "Pendiente";
        //    miHorario.Nombre = "Sin Clases los Lunes";
        //    miHorario.Fecha = System.DateTime.Now;
        //    bool expected = true; // TODO: Initialize to an appropriate value
        //    bool actual;
        //    actual = target.InsertarHorarioPreMatricula(miEstudiante, miHorario);
        //    Assert.AreEqual(expected, actual);
        //}

        [Test]
        public void TraerUltimoIdHorarioPreMatriculaTest()
        {
            SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula(); // TODO: Initialize to an appropriate value
            int miEstudiante = 1; // TODO: Initialize to an appropriate value
            int expected = 3; // TODO: Initialize to an appropriate value
            int actual;
            actual = target.TraerUltimoIdHorarioPreMatricula(miEstudiante);
            Assert.AreEqual(expected, actual);
        }

        //Test InsertarEstudianteHorario
        //[Test]
        //public void InsertarEstudianteHorarioTest()
        //{
        //    SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula(); // TODO: Initialize to an appropriate value
        //    int MaxHorarioPreMatricula = 11; // TODO: Initialize to an appropriate value
        //    HorarioPreMatricula miHorario = new HorarioPreMatricula(); // TODO: Initialize to an appropriate value
        //    miHorario.Fecha = System.DateTime.Now;
        //    miHorario.Nombre = "Requiescat in pace";

        //    SeccionMateria materia2 = new SeccionMateria();
        //    materia2.IdSeccionMateria = 2;

        //    Practica practica = new Practica();
        //    practica.IdPractica = 2;

        //    List<SeccionMateria> nuevaLista = new List<SeccionMateria>();

        //    nuevaLista.Add(materia2);

        //    miHorario.ListaSecciones = nuevaLista;

        //    bool expected = true; // TODO: Initialize to an appropriate value
        //    bool actual;
        //    actual = target.InsertarEstudianteHorario(MaxHorarioPreMatricula, miHorario);
        //    Assert.AreEqual(expected, actual);
        //}

        [Test]
        public void CargarMisHorariosTest()
        {
            SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula(); // TODO: Initialize to an appropriate value
            int miEstudiante = 1; // TODO: Initialize to an appropriate value
            string horario1 = "Sin Clases los Viernes";
            string horario2 = "Prioridad 1";
            string horario3 = "Medio dias libres";
            List<HorarioPreMatricula> actual;
            actual = target.CargarMisHorarios(miEstudiante);
            Assert.AreEqual(horario1, actual[0].Nombre);
            Assert.AreEqual(horario2, actual[1].Nombre);
            Assert.AreEqual(horario3, actual[2].Nombre);
        }

        [Test]
        public void BuscarListaSeccionMateriaTest()
        {
            SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula(); // TODO: Initialize to an appropriate value
            int idLista = 1; // TODO: Initialize to an appropriate value

            string nombre1 = "Trigonometría";
            int cedula1 = 12345908;

            string nombre2 = "Matemáticas básicas";
            int cedula2 = 13890765;
           // string practica = "Base de Datos II";

            List<SeccionMateria> actual;
            actual = target.BuscarListaSeccionMateria(idLista);

            Assert.AreEqual(nombre1, actual[0].Materia.Nombre);
            Assert.AreEqual(cedula1, actual[0].Profesor.Cedula);
            Assert.AreEqual(nombre2, actual[1].Materia.Nombre);
            Assert.AreEqual(cedula2, actual[1].Profesor.Cedula);
           // Assert.AreEqual(practica, actual[1].ListaPractica[0].NombrePractica);
        }

        [Test]
        public void BuscarSeccionMateriaTest()
        {
            SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula(); // TODO: Initialize to an appropriate value
            int idSeccionMateria = 2; // TODO: Initialize to an appropriate value
            int codigo = 2;
            int profesor = 14990555;
            int codigo1 = 1;
            SeccionMateria actual;
            actual = target.BuscarSeccionMateria(idSeccionMateria);

            Assert.AreEqual(codigo, actual.Codigo);
            Assert.AreEqual(profesor, actual.Profesor.Cedula);
            Assert.AreEqual(codigo1, actual.Materia.Codigo);
        }

        [Test]
        public void BuscarProfesorTest()
        {
            SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula(); // TODO: Initialize to an appropriate value
            int idProfesor = 12345908; // TODO: Initialize to an appropriate value
            string nombre = "David"; // TODO: Initialize to an appropriate value
            string apellido = "Hernandez";
            Profesor actual;
            actual = target.BuscarProfesor(idProfesor);
            Assert.AreEqual(nombre, actual.Nombre);
            Assert.AreEqual(apellido, actual.Apellido);
        }

        [Test]
        public void BuscarMateriaTest()
        {
            SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula(); // TODO: Initialize to an appropriate value
            int idMateria = 2; // TODO: Initialize to an appropriate value
            string expected = "Sistemas Distribuidos"; // TODO: Initialize to an appropriate value
            Materia actual;
            actual = target.BuscarMateria(idMateria);
            Assert.AreEqual(expected, actual.Nombre);
        }

        [Test]
        public void BuscarListaHorariosClaseMateriaTest()
        {
            SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula(); // TODO: Initialize to an appropriate value
            int idSeccionMateria = 2; // TODO: Initialize to an appropriate value

            string dia1 = "Martes";
            DateTime horaIni1 = new DateTime(1900, 01, 01, 18, 00, 0);
            DateTime horaFin1 = new DateTime(1900, 01, 01, 20, 00, 0);

            string dia2 = "Jueves";
            DateTime horaIni2 = new DateTime(1900, 01, 01, 18, 00, 0);
            DateTime horaFin2 = new DateTime(1900, 01, 01, 20, 00, 0);

            List<HorarioDeClase> actual;
            actual = target.BuscarListaHorariosClaseMateria(idSeccionMateria);

            Assert.AreEqual(dia1, actual[0].Dia);
            Assert.AreEqual(horaIni1, actual[0].HoraInicio);
            Assert.AreEqual(horaFin1, actual[0].HoraFin);
            Assert.AreEqual(dia2, actual[1].Dia);
            Assert.AreEqual(horaIni2, actual[1].HoraInicio);
            Assert.AreEqual(horaFin2, actual[1].HoraFin);
        }

        [Test]
        public void BuscarPracticaTest()
        {
            SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula(); // TODO: Initialize to an appropriate value
            int idPractica = 1; // TODO: Initialize to an appropriate value
            Practica expected = new Practica(1, "Practica Evaluacion de Sistemas Informaticos"); // TODO: Initialize to an appropriate value
            Practica actual = target.BuscarPractica(idPractica);
            Assert.AreEqual(expected.NumeroSeccion, actual.NumeroSeccion);
            Assert.AreEqual(expected.NombrePractica, actual.NombrePractica);
        }

        [Test]
        public void BuscarListaHorariosClasePracticaTest()
        {

            int idPractica = 1;
            DateTime horaIni = new DateTime(1900, 01, 01, 10, 00, 0);
            DateTime horaFin = new DateTime(1900, 01, 01, 12, 00, 0);

            SqlServerHorarioPreMatricula sqlServer = new SqlServerHorarioPreMatricula();
            List<HorarioDeClase> listaHorario = new List<HorarioDeClase>();

            listaHorario = sqlServer.BuscarListaHorariosClasePractica(idPractica);

            Assert.AreEqual("Viernes", listaHorario[0].Dia);
            Assert.AreEqual(horaIni, listaHorario[0].HoraInicio);
            Assert.AreEqual(horaFin, listaHorario[0].HoraFin);
        }

        [Test]
        public void MisMateriasAprobadasTest()
        {
            SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula(); // TODO: Initialize to an appropriate value
            int idEstudiante = 1; // TODO: Initialize to an appropriate value

            Materia materia1 = new Materia();
            materia1.Nombre = "Trigonometría";
            Materia materia2 = new Materia();
            materia2.Nombre = "Matemáticas básicas";

            List<Materia> actual;
            actual = target.MisMateriasAprobadas(idEstudiante);
            Assert.AreEqual(materia1.Nombre, actual[0].Nombre);
            Assert.AreEqual(materia2.Nombre, actual[1].Nombre);
        }

        [Test]
        public void BuscarListaPrelacionTest()
        {
            SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula();
            int idPensum = 4;
            int idMateria = 15;
            string materia1 = "Trigonometría";
         //   string materia2 = "Sistemas Distribuidos";

            List<Materia> actual;
            actual = target.BuscarListaPrelacion(idPensum, idMateria);

            Assert.AreEqual(materia1, actual[0].Nombre);
       //     Assert.AreEqual(materia2, actual[1].Nombre);
        }

        [Test]
        public void CrearListaPrelacionTest()
        {
            SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula();
            int idPensum = 4;
            string materia1 = "Trigonometría";
            string materia2 = "Matemáticas básicas";
            string materia3 = "Introducción a la Informática";


            List<Prelacion> actual;
            actual = target.CrearListaPrelacion(idPensum);

            Assert.AreEqual(materia1, actual[0].MiMateriaPensum.Nombre);
            Assert.AreEqual(materia2, actual[1].MiMateriaPensum.Nombre);
            Assert.AreEqual(materia3, actual[2].MiMateriaPensum.Nombre);
        }

        [Test]
        public void BuscarPensumTest()
        {
            SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula();
            int idEscuela = 1;
            int expected = 4;
            int actual;
            actual = target.BuscarPensum(idEscuela);
            Assert.AreEqual(expected, actual);
        }

        [Test]
        public void MateriasDisponiblesTest()
        {
            SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula();
            string nombreEscuela = "Ingeniería Informática";
            string materia1 = "Trigonometría";
            string materia2 = "Matemáticas básicas";
            string materia3 = "Introducción a la Informática";

            List<Prelacion> actual;
            actual = target.MateriasDisponibles(nombreEscuela);

            Assert.AreEqual(materia1, actual[0].MiMateriaPensum.Nombre);
            Assert.AreEqual(materia2, actual[1].MiMateriaPensum.Nombre);
            Assert.AreEqual(materia3, actual[2].MiMateriaPensum.Nombre);
        }

        [Test]
        public void ConsultarSeccionesParaUnaMateriaTest()
        {
            SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula();

            int idMateria = 1;
            int seccion1 = 1;
            int seccion2 = 2;

            List<SeccionMateria> actual;
            actual = target.ConsultarSeccionesParaUnaMateria(idMateria);

            Assert.AreEqual(seccion1, actual[0].IdSeccionMateria);
            Assert.AreEqual(seccion2, actual[1].IdSeccionMateria);
        }

        [Test]
        public void CargarHorariosEstudiantesTest()
        {
            SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula();
            int idEscuela = 1;
            int estudiante1 = 19345678;
            int estudiante2 = 20145678;
            int estudiante3 = 17904594;
            int estudiante5 = 19191939;
            List<Estudiante> actual;
            actual = target.CargarHorariosEstudiantes(idEscuela);
            Assert.AreEqual(estudiante1, actual[0].Cedula);
            Assert.AreEqual(estudiante2, actual[1].Cedula);
            Assert.AreEqual(estudiante3, actual[2].Cedula);
            Assert.AreEqual(estudiante5, actual[4].Cedula);
        }

        [Test]
        public void BuscarEstudianteTest()
        {
            SqlServerHorarioPreMatricula target = new SqlServerHorarioPreMatricula();
            int idEstudiante = 1;
            Estudiante expected = new Estudiante();
            expected.Nombre = "Pedro";
            expected.Apellido = "Perez";

            Estudiante actual;
            actual = target.BuscarEstudiante(idEstudiante);

            Assert.AreEqual(expected.Nombre, actual.Nombre);
            Assert.AreEqual(expected.Apellido, actual.Apellido);
        }

        #endregion

        #region Pruebas para la Clase Estudiante

        [Test]
        public void GenerarMateriasPreCandidatasTest()
        {
            Estudiante target = new Estudiante();
            target.Cedula = 19191939;
            target.IdEst = 5;
            target.Carrera = "Ingeniería Informática";

            string materia1 = "Humanidades I"; 


            List<Materia> actual;
            actual = target.GenerarMateriasPreCandidatas();

            Assert.AreEqual(materia1, actual[0].Nombre);
        }

        [Test]
        public void GenerarMateriasObligatoriasTest()
        {
            Estudiante target = new Estudiante();
                 target.IdEst = 1;
                 target.Carrera = "Ingeniería Informática";
        

            List<Materia> misMateriasCandidatas = target.GenerarMateriasPreCandidatas();
            int materia1 = 14;
            List<Materia> actual;
            actual = target.GenerarMateriasObligatorias(misMateriasCandidatas);
            Assert.AreEqual(materia1, actual[0].Codigo);
        }

        //ExistNombrePrematricula
        //[Test]
        //public void ExistNombrePreMatriculaTest()
        //{
        //    Estudiante target = new Estudiante();
        //    string miNombrePreMatricula = "Sin Clase los Viernes";
        //    bool expected = true;
        //    bool actual;
        //    actual = target.ExistNombrePreMatricula(miNombrePreMatricula);
        //    Assert.AreEqual(expected, actual);
        //}

        [Test]

        public void ValidarChoqueHorarioTest()
        {
            List<SeccionMateria> listaSeccionesNoConflictivas = new List<SeccionMateria>();

            List<HorarioDeClase> listaHorario1 = new List<HorarioDeClase>();
            List<HorarioDeClase> listaHorario2 = new List<HorarioDeClase>();

            SeccionMateria seccion1 = new SeccionMateria();

            HorarioDeClase horario1 = new HorarioDeClase();
            horario1.Dia = "Lunes";
            horario1.HoraInicio = new DateTime(1900, 01, 01, 7, 00, 0);
            horario1.HoraFin = new DateTime(1900, 01, 01, 10, 00, 0);
            horario1.IdHorarioClase = 1;

            SeccionMateria seccion2 = new SeccionMateria();
            HorarioDeClase horario2 = new HorarioDeClase();
            horario1.Dia = "Lunes";
            horario1.HoraInicio = new DateTime(1900, 01, 01, 10, 00, 0);
            horario1.HoraFin = new DateTime(1900, 01, 01, 13, 00, 0);
            horario1.IdHorarioClase = 2;

            listaHorario1.Add(horario1);
            seccion1.HorasClase = listaHorario1;

            listaHorario2.Add(horario2);
            seccion2.HorasClase = listaHorario2;

            listaSeccionesNoConflictivas.Add(seccion1);
            listaSeccionesNoConflictivas.Add(seccion2);
            // Fin de creacion de horario SIN conflicto ***************************************************************

            List<SeccionMateria> listaSeccionesConflictivas = new List<SeccionMateria>();

            List<HorarioDeClase> listaHorario3 = new List<HorarioDeClase>();
            List<HorarioDeClase> listaHorario4 = new List<HorarioDeClase>();

            SeccionMateria seccion3 = new SeccionMateria();

            HorarioDeClase horario3 = new HorarioDeClase();
            horario1.Dia = "Lunes";
            horario1.HoraInicio = new DateTime(1900, 01, 01, 9, 00, 0);
            horario1.HoraFin = new DateTime(1900, 01, 01, 12, 00, 0);
            horario1.IdHorarioClase = 3;
 

            SeccionMateria seccion4 = new SeccionMateria();
            HorarioDeClase horario4 = new HorarioDeClase();
            horario1.Dia = "Lunes";
            horario1.HoraInicio = new DateTime(1900, 01, 01, 7, 00, 0);
            horario1.HoraFin = new DateTime(1900, 01, 01, 11, 00, 0);
            horario1.IdHorarioClase = 4;
 

            listaHorario3.Add(horario3);
            seccion3.HorasClase = listaHorario3;

            listaHorario4.Add(horario4);
            seccion4.HorasClase = listaHorario4;

            listaSeccionesConflictivas.Add(seccion3);
            listaSeccionesConflictivas.Add(seccion4);
            // Fin de creacion de horario CON conflicto ***************************************************************

            Estudiante estudianteBien = new Estudiante();
            Estudiante estudianteMal = new Estudiante();

            bool expected1 = true;
            bool actual1;

            bool expected2 = false;
            bool actual2;

            actual1 = estudianteBien.ValidarChoqueHorario(listaSeccionesNoConflictivas);
            actual2 = estudianteMal.ValidarChoqueHorario(listaSeccionesConflictivas);

            Assert.AreEqual(expected1, actual1);
            Assert.AreEqual(expected2, actual2);
        }

        #endregion

        #region Pruebas para la Clase Escuela

        [Test]
        public void SimularFinPeriodoAcademicoTest()
        {
            Escuela target = new Escuela();
            target.IdEscuela = 1;
            bool expected = true;
            Assert.AreEqual(expected, target.SimularFinPeriodoAcademico());
        }

        [Test]
        public void EnviarCorreoTest()
        {
            Escuela target = new Escuela();
            int idEstudiante = 1;
            HorarioPreMatricula horario = new HorarioPreMatricula();
            horario.Nombre = "Mail de Prueba";
            bool expected = true;
            bool actual;
            actual = target.EnviarCorreo(idEstudiante, horario);
            Assert.AreEqual(expected, actual);
        }

        //[Test]
        //public void AprobarHorarioTest()
        //{
        //    Escuela target = new Escuela();
        //    int idEstudiante = 1;
        //    int idHorario = 2;
        //    bool expected = true;
        //    bool actual;
        //    actual = target.AprobarHorario(idEstudiante, idHorario);
        //    Assert.AreEqual(expected, actual);
        //}

        #endregion
    }
}
